All files / application/auth/commands RegisterUserCommandHandler.js

0% Statements 0/25
0% Branches 0/13
0% Functions 0/3
0% Lines 0/25

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84                                                                                                                                                                       
const bcrypt = require('bcryptjs');
const JwtService = require('../../services/JwtService');
 
const jwtService = new JwtService();
 
/**
 * Register User Command Handler
 * Handles user registration business logic
 */
class RegisterUserCommandHandler {
  constructor(prisma, emailService) {
    this.prisma = prisma;
    this.emailService = emailService;
  }
 
  /**
   * Execute user registration command
   * @param {RegisterUserCommand} command 
   * @returns {Promise<Object>} { user, token }
   */
  async handle(command) {
    const { name, email, password } = command;
 
    // Validáció
    if (!name || !email || !password) {
      throw new Error('Name, email and password are required');
    }
 
    if (password.length < 6) {
      throw new Error('Password must be at least 6 characters long');
    }
 
    // Email formátum ellenőrzés
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!emailRegex.test(email)) {
      throw new Error('Invalid email format');
    }
 
    // Ellenőrizzük, hogy létezik-e már a user
    const existingUser = await this.prisma.user.findUnique({
      where: { email }
    });
 
    if (existingUser) {
      throw new Error('User with this email already exists');
    }
 
    // Jelszó hashelése (bcrypt)
    const hashedPassword = await bcrypt.hash(password, 10);
 
    // User létrehozása
    const user = await this.prisma.user.create({
      data: {
        name,
        email,
        password: hashedPassword
      }
    });
 
    // Welcome email küldése (async, nem várunk rá)
    if (this.emailService) {
      this.emailService.sendWelcomeEmail(email, name).catch(err => {
        console.error('❌ Failed to send welcome email:', err.message);
      });
    }
 
    // JWT token generálása
    const token = jwtService.generateToken({
      userId: user.id,
      email: user.email
    });
 
    // Jelszót ne adjuk vissza a response-ban
    const { password: _, ...userWithoutPassword } = user;
 
    return {
      user: userWithoutPassword,
      token
    };
  }
}
 
module.exports = RegisterUserCommandHandler;